#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
强制修复matplotlib中文字体显示问题
解决中文显示为方块的问题
"""

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
import sys
import subprocess
import shutil
from pathlib import Path

def force_clear_cache():
    """强制清除所有相关缓存"""
    print("1. 强制清除所有缓存...")
    
    # 清除matplotlib缓存
    cache_dir = matplotlib.get_cachedir()
    print(f"matplotlib缓存目录: {cache_dir}")
    
    # 删除所有缓存文件
    for root, dirs, files in os.walk(cache_dir):
        for file in files:
            if file.endswith('.json') or 'font' in file.lower():
                try:
                    os.remove(os.path.join(root, file))
                    print(f"✓ 删除缓存文件: {file}")
                except:
                    pass
    
    # 清除用户缓存
    user_cache_dirs = [
        os.path.expanduser('~/.cache/matplotlib'),
        os.path.expanduser('~/.matplotlib'),
        os.path.expanduser('~/.cache/fontconfig')
    ]
    
    for cache_dir in user_cache_dirs:
        if os.path.exists(cache_dir):
            try:
                shutil.rmtree(cache_dir)
                print(f"✓ 清除用户缓存: {cache_dir}")
            except:
                pass

def copy_fonts_to_matplotlib():
    """将系统字体复制到matplotlib字体目录"""
    print("2. 复制字体到matplotlib目录...")
    
    # 获取matplotlib字体目录
    mpl_data_dir = os.path.dirname(matplotlib.matplotlib_fname())
    fonts_dir = os.path.join(mpl_data_dir, 'fonts', 'ttf')
    
    if not os.path.exists(fonts_dir):
        os.makedirs(fonts_dir, exist_ok=True)
        print(f"创建matplotlib字体目录: {fonts_dir}")
    
    # 系统字体目录
    system_font_dirs = [
        '/usr/share/fonts/chinese',
        '/usr/share/fonts/google-noto-cjk',
        '/usr/share/fonts/wqy-microhei',
        '/usr/share/fonts/wqy-zenhei'
    ]
    
    copied_count = 0
    for font_dir in system_font_dirs:
        if os.path.exists(font_dir):
            print(f"处理字体目录: {font_dir}")
            for file in os.listdir(font_dir):
                if file.endswith(('.ttf', '.otf', '.ttc')):
                    src_path = os.path.join(font_dir, file)
                    dst_path = os.path.join(fonts_dir, file)
                    try:
                        if not os.path.exists(dst_path):
                            shutil.copy2(src_path, dst_path)
                            print(f"✓ 复制字体: {file}")
                            copied_count += 1
                    except Exception as e:
                        print(f"✗ 复制失败 {file}: {e}")
    
    print(f"总共复制了 {copied_count} 个字体文件")

def force_rebuild_fonts():
    """强制重建字体系统"""
    print("3. 强制重建字体系统...")
    
    # 更新系统字体缓存
    try:
        subprocess.run(['fc-cache', '-fv'], check=True, capture_output=True)
        print("✓ 系统字体缓存更新成功")
    except:
        print("⚠️  系统字体缓存更新失败")
    
    # 强制重建matplotlib字体管理器
    try:
        # 清空字体列表
        fm.fontManager.ttflist = []
        fm.fontManager.afmlist = []
        
        # 重新初始化
        fm.fontManager.__init__()
        
        # 强制刷新
        if hasattr(fm.fontManager, '_rebuild'):
            fm.fontManager._rebuild()
        
        print("✓ matplotlib字体管理器重建成功")
    except Exception as e:
        print(f"⚠️  matplotlib字体管理器重建失败: {e}")

def set_force_font_config():
    """设置强制字体配置"""
    print("4. 设置强制字体配置...")
    
    # 获取所有可用字体
    all_fonts = [f.name for f in fm.fontManager.ttflist]
    print(f"系统总字体数: {len(all_fonts)}")
    
    # 查找中文字体
    chinese_fonts = []
    chinese_keywords = ['chinese', 'han', 'cjk', 'wenquanyi', 'noto', 'source', 'simhei', 'simsun', 'kaiti']
    
    for font in all_fonts:
        font_lower = font.lower()
        if any(keyword in font_lower for keyword in chinese_keywords):
            chinese_fonts.append(font)
    
    print(f"找到 {len(chinese_fonts)} 个中文字体:")
    for font in chinese_fonts[:10]:
        print(f"  - {font}")
    
    # 设置字体配置
    if chinese_fonts:
        font_list = chinese_fonts + ['DejaVu Sans', 'Arial', 'sans-serif']
    else:
        # 使用已知的中文字体名称
        font_list = [
            'Source Han Sans CN', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei',
            'WenQuanYi Zen Hei', 'Noto Sans CJK JP', 'SimHei', 'SimSun', 
            'KaiTi', 'Microsoft YaHei', 'DejaVu Sans', 'Arial', 'sans-serif'
        ]
    
    # 强制设置字体
    matplotlib.rcParams['font.family'] = 'sans-serif'
    matplotlib.rcParams['font.sans-serif'] = font_list
    matplotlib.rcParams['axes.unicode_minus'] = False
    matplotlib.rcParams['font.size'] = 12
    
    # 设置后端
    matplotlib.use('Agg')  # 使用非交互式后端
    
    print(f"✓ 设置字体优先级: {font_list[:5]}...")

def create_font_config_file():
    """创建字体配置文件"""
    print("5. 创建字体配置文件...")
    
    # 创建配置目录
    config_dir = os.path.expanduser('~/.matplotlib')
    os.makedirs(config_dir, exist_ok=True)
    
    # 配置文件内容
    config_content = """# matplotlib中文字体强制配置
font.family: sans-serif
font.sans-serif: Source Han Sans CN, Noto Sans CJK SC, WenQuanYi Micro Hei, WenQuanYi Zen Hei, Noto Sans CJK JP, SimHei, SimSun, KaiTi, Microsoft YaHei, DejaVu Sans, Arial, sans-serif
axes.unicode_minus: False
font.size: 12
figure.dpi: 100
savefig.dpi: 300
savefig.bbox: tight
backend: Agg
"""
    
    # 写入配置文件
    config_file = os.path.join(config_dir, 'matplotlibrc')
    with open(config_file, 'w', encoding='utf-8') as f:
        f.write(config_content)
    
    print(f"✓ 配置文件已创建: {config_file}")

def test_force_font():
    """测试强制字体配置"""
    print("6. 测试强制字体配置...")
    
    # 创建测试图表
    fig, ax = plt.subplots(figsize=(12, 8))
    
    # 测试文本
    test_texts = [
        '特征相关性热力图',
        '违约情况分析', 
        '特征变量重要性',
        '模型性能评估',
        '准确率: 85.6%',
        '精确率: 82.3%',
        '召回率: 78.9%',
        'F1值: 80.5%',
        'AUC值: 0.876',
        '特异度: 91.2%',
        '灵敏度: 78.9%'
    ]
    
    # 添加测试文本
    for i, text in enumerate(test_texts):
        ax.text(0.1, 0.9 - i*0.08, text, fontsize=14, transform=ax.transAxes)
    
    ax.set_title('中文字体测试 - 信用卡违约预测项目', fontsize=16, fontweight='bold')
    ax.set_xlim(0, 1)
    ax.set_ylim(0, 1)
    ax.axis('off')
    
    # 添加说明
    ax.text(0.5, 0.05, '如果能看到清晰的中文文字，说明字体配置成功！', 
            fontsize=12, ha='center', transform=ax.transAxes, 
            bbox=dict(boxstyle="round,pad=0.3", facecolor="lightgreen"))
    
    # 保存测试图片
    plt.tight_layout()
    plt.savefig('force_font_test.png', dpi=150, bbox_inches='tight')
    plt.close()
    
    print("✓ 测试图片已保存: force_font_test.png")

def main():
    """主函数"""
    print("=== 强制修复matplotlib中文字体显示问题 ===")
    print(f"Python版本: {sys.version}")
    print(f"matplotlib版本: {matplotlib.__version__}")
    
    try:
        # 执行强制修复步骤
        force_clear_cache()
        copy_fonts_to_matplotlib()
        force_rebuild_fonts()
        set_force_font_config()
        create_font_config_file()
        test_force_font()
        
        print("\n🎉 强制修复完成！")
        print("请检查生成的测试图片: force_font_test.png")
        print("如果中文显示正常，现在可以运行你的Python脚本了！")
        
    except Exception as e:
        print(f"\n❌ 修复过程中出现错误: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main()
